/**
 * 饮食计划服务类 - 管理饮食计划数据
 */

// 初始化云环境
const db = () => wx.cloud.database();
const mealPlansCollection = () => db().collection('mymealplans');
const userService = require('./userService');

/**
 * 获取指定日期的饮食计划
 * @param {string} date 日期字符串 YYYY-MM-DD
 */
const getMealPlansByDate = async (date) => {
  if (!date) return [];
  
  try {
    // 获取当前用户ID
    const userId = userService.getCurrentUserId();
    if (!userId) {
      console.error('未找到用户ID，无法获取饮食计划');
      return [];
    }
    
    // 查询当前用户指定日期的饮食计划
    const { data } = await mealPlansCollection().where({
      userId: userId,
      date: date
    }).get();
    
    return data;
  } catch (error) {
    console.error(`获取饮食计划(${date})失败`, error);
    return [];
  }
};

/**
 * 按周获取饮食计划
 * @param {string} startDate 开始日期 YYYY-MM-DD
 * @param {string} endDate 结束日期 YYYY-MM-DD
 */
const getMealPlansByWeek = async (startDate, endDate) => {
  if (!startDate || !endDate) return [];
  
  try {
    // 获取当前用户ID
    const userId = userService.getCurrentUserId();
    if (!userId) {
      console.error('未找到用户ID，无法获取饮食计划');
      return [];
    }
    
    // 查询当前用户指定日期范围的饮食计划
    const { data } = await mealPlansCollection().where({
      userId: userId,
      date: db().command.gte(startDate).and(db().command.lte(endDate))
    }).get();
    
    return data;
  } catch (error) {
    console.error(`获取周饮食计划(${startDate}~${endDate})失败`, error);
    return [];
  }
};

/**
 * 添加饮食计划
 * @param {Object} mealPlan 饮食计划数据
 */
const addMealPlan = async (mealPlan) => {
  if (!mealPlan) return null;
  
  try {
    // 获取当前用户ID
    const userId = userService.getCurrentUserId();
    if (!userId) {
      console.error('未找到用户ID，无法添加饮食计划');
      return null;
    }
    
    // 构建饮食计划数据
    const mealPlanData = {
      ...mealPlan,
      userId: userId,
      createTime: db().serverDate()
    };
    
    // 添加饮食计划
    const res = await mealPlansCollection().add({
      data: mealPlanData
    });
    
    return { ...mealPlanData, _id: res._id };
  } catch (error) {
    console.error('添加饮食计划失败', error);
    return null;
  }
};

/**
 * 删除饮食计划
 * @param {string} id 饮食计划ID
 */
const deleteMealPlan = async (id) => {
  if (!id) return false;
  
  try {
    // 获取当前用户ID
    const userId = userService.getCurrentUserId();
    if (!userId) {
      console.error('未找到用户ID，无法删除饮食计划');
      return false;
    }
    
    // 验证饮食计划是否属于当前用户
    const { data } = await mealPlansCollection().doc(id).get();
    if (!data || data.userId !== userId) {
      console.error('无权删除此饮食计划');
      return false;
    }
    
    // 删除饮食计划
    await mealPlansCollection().doc(id).remove();
    
    return true;
  } catch (error) {
    console.error(`删除饮食计划(${id})失败`, error);
    return false;
  }
};

/**
 * 获取饮食计划统计数据
 * @param {string} date 日期字符串 YYYY-MM-DD
 */
const getMealPlanStats = async (date) => {
  if (!date) return null;
  
  try {
    // 获取当前用户ID
    const userId = userService.getCurrentUserId();
    if (!userId) {
      console.error('未找到用户ID，无法获取饮食计划统计');
      return null;
    }
    
    // 查询当前用户指定日期的饮食计划
    const mealPlans = await getMealPlansByDate(date);
    
    // 计算营养统计数据
    const stats = {
      totalCalories: 0,
      totalProtein: 0,
      totalCarbs: 0,
      totalFat: 0,
      
      breakfastCalories: 0,
      lunchCalories: 0,
      dinnerCalories: 0,
      
      breakfastCount: 0,
      lunchCount: 0,
      dinnerCount: 0
    };
    
    // 分类处理饮食数据
    mealPlans.forEach(meal => {
      stats.totalCalories += (meal.calories || 0);
      stats.totalProtein += (meal.protein || 0);
      stats.totalCarbs += (meal.carbs || 0);
      stats.totalFat += (meal.fat || 0);
      
      if (meal.type === 'breakfast') {
        stats.breakfastCalories += (meal.calories || 0);
        stats.breakfastCount++;
      } else if (meal.type === 'lunch') {
        stats.lunchCalories += (meal.calories || 0);
        stats.lunchCount++;
      } else if (meal.type === 'dinner') {
        stats.dinnerCalories += (meal.calories || 0);
        stats.dinnerCount++;
      }
    });
    
    return stats;
  } catch (error) {
    console.error(`获取饮食计划统计(${date})失败`, error);
    return null;
  }
};

module.exports = {
  getMealPlansByDate,
  getMealPlansByWeek,
  addMealPlan,
  deleteMealPlan,
  getMealPlanStats
}; 